import turtle

import time


# 定义绘制月亮的函数

def drawMoon():
    # 抬起画笔，移动到指定位置，但不绘制轨迹
    turtle.penup()
    # 将画笔移动到坐标(-150, 0)
    turtle.goto(-150, 0)
    # 设置填充颜色为浅黄色
    turtle.fillcolor((255, 215, 10))
    # 放下画笔，开始绘制
    turtle.pendown()
    # 开始填充颜色
    turtle.begin_fill()
    # 绘制一个半径为112的圆形，代表满月
    turtle.circle(112)
    # 结束填充颜色
    turtle.end_fill()
# 定义绘制云朵的函数
def drawCloud():
    # 抬起画笔，移动到指定位置，但不绘制轨迹
    turtle.penup()
    # 将画笔移动到坐标(-500, 200)
    turtle.goto(-500, 200)
    # 设置填充颜色为浅灰色
    turtle.fillcolor((245, 245, 245))
    # 设置画笔颜色为白色
    turtle.pencolor((255, 255, 255))
    # 设置画笔粗细为8
    turtle.pensize(8)
    # 放下画笔，开始绘制
    turtle.pendown()
    # 绘制一段云朵的主体
    turtle.forward(250)

    # 定义一个内部函数，用于绘制云朵的卷曲部分
    def cloud(mode='right'):
        # 循环绘制云朵的卷曲部分
        for i in range(90):
            # 动态调整画笔粗细
            turtle.pensize((i + 1) * 0.2 + 5)
            # 根据模式旋转方向
            turtle.right(1) if mode == 'right' else turtle.left(1)
            # 向前移动一小段距离
            turtle.forward(0.9)
        # 反向循环绘制云朵的另一侧卷曲部分
        for i in range(90):
            #创建一个动态变化的画笔粗细，它随着循环的进行先增加后减
            turtle.pensize(90 * 0.2 + 5 - 0.2 * (i + 1))
            #如果 mode 等于 'right'，则执行 turtle.right(1)，表示向右转1度
            turtle.right(1) if mode == 'right' else turtle.left(1)
            turtle.forward(0.9)

    # 绘制右侧的云朵卷曲部分
    cloud()
    # 向前移动画笔，为下一段云朵留出间隔
    turtle.forward(100)
    # 绘制左侧的云朵卷曲部分
    cloud('left')
    # 再次向前移动画笔，完成这段云朵的绘制
    turtle.forward(600)

# 定义绘制山川的函数
def drawMountain():
    # 抬起画笔，移动到指定位置，但不绘制轨迹
    turtle.penup()
    # 将画笔移动到坐标(-500, -250)
    turtle.goto(-500, -250)
    # 设置画笔粗细为4
    turtle.pensize(4)
    # 设置填充颜色为绿色
    turtle.fillcolor((0, 187, 119))
    # 设置画笔颜色为深棕色
    turtle.pencolor((31, 28, 24))
    # 放下画笔，开始绘制
    turtle.pendown()
    # 开始填充颜色
    turtle.begin_fill()
    # 通过一系列向前移动和转向操作绘制山川的轮廓
    turtle.left(20)
    turtle.forward(400)
    turtle.right(45)
    turtle.forward(200)
    turtle.left(60)
    turtle.forward(300)
    turtle.right(70)
    turtle.forward(300)
    # 将画笔移动到起点，准备绘制下一部分山川
    turtle.goto(500, -300)
    turtle.goto(-500, -300)
    # 结束填充颜色
    turtle.end_fill()

# 定义绘制嫦娥的函数
def draw_ChangE():
    lx, ly = -30, 50  # 设置嫦娥绘制的起始坐标点

    # 绘制左手
    turtle.penup()  # 抬起画笔，移动时不绘制
    turtle.color("#ffffeb")  # 设置画笔颜色为浅黄色
    turtle.width(4)  # 设置画笔粗细为4
    turtle.goto(lx, ly)  # 移动到嫦娥左手的位置
    turtle.seth(50)  # 设置画笔朝向为50度
    turtle.pendown()  # 放下画笔，开始绘制
    turtle.fd(10)  # 向前绘制10个单位
    turtle.circle(-3, 180)  # 绘制半径为3的圆弧，角度为180度
    turtle.right(170)  # 右转170度
    turtle.circle(-6, 180)  # 绘制半径为6的圆弧，角度为180度
    turtle.circle(-50, 20)  # 绘制半径为50的圆弧，角度为20度

    # 绘制左袖
    turtle.penup()  # 抬起画笔
    turtle.color('red')  # 设置画笔颜色为红色
    turtle.goto(lx, ly)  # 移动到嫦娥左袖的位置
    turtle.seth(-140)  # 设置画笔朝向为-140度
    turtle.pendown()  # 放下画笔
    turtle.fd(16)  # 向前绘制16个单位
    turtle.penup()
    turtle.goto(lx, ly)
    turtle.seth(-50)
    turtle.pendown()
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(10)
    turtle.circle(-50, 40)
    # 绘制衣服
    turtle.color('#f3dd64')  # 设置画笔颜色为浅橙色
    turtle.penup()  # 抬起画笔
    turtle.right(90)
    turtle.fd(10)
    turtle.right(180)
    turtle.pendown()
    turtle.circle(-100, 8)
    turtle.circle(-20, 80)
    turtle.circle(-100, 11)
    # 衣服2
    turtle.penup()
    turtle.circle(-100, -11)
    turtle.circle(-20, -80)
    turtle.fd(8)
    turtle.pendown()
    turtle.circle(-100, 6)
    turtle.circle(-15, 82)
    turtle.circle(-40, 35)
    # 衣服-裙
    turtle.color('red')
    turtle.penup()
    turtle.circle(-40, -35)
    turtle.circle(-15, -82)
    turtle.fd(10)
    turtle.right(10)
    turtle.pendown()
    turtle.circle(-100, 60)
    turtle.right(60)
    turtle.circle(-100, 60)
    turtle.right(60)
    turtle.circle(-200, 2)

    # 绘制右袖和右手
    # 右袖
    turtle.penup()
    turtle.circle(-200, -2)
    turtle.right(-60)
    turtle.circle(-100, -60)
    turtle.right(-60)
    turtle.circle(-100, -60)
    turtle.right(-10)
    turtle.fd(-6)
    turtle.circle(-100, -6)
    turtle.fd(-8)
    turtle.circle(-20, 80)
    turtle.circle(-100, 12)
    turtle.right(110)
    turtle.fd(10)
    turtle.right(180)
    turtle.pendown()
    turtle.circle(-50, 50)
    turtle.right(70)
    turtle.circle(-50, 40)
    turtle.right(57)
    turtle.circle(-200, 10)
    # 右手
    turtle.penup()
    turtle.circle(-200, -10)
    turtle.right(-57)
    turtle.circle(-50, -4)
    turtle.color("#ffffeb")
    turtle.left(80)
    turtle.circle(10, 15)
    turtle.pendown()
    turtle.circle(10, 190)

    # 绘制下方飘带
    turtle.penup()  # 抬起画笔
    turtle.circle(10, -90)  # 绘制圆弧
    turtle.seth(-140)  # 设置画笔朝向为-140度
    turtle.color('#ffdd64')  # 设置画笔颜色为浅橙色
    turtle.circle(-10, 10)
    turtle.pendown()
    turtle.circle(-10, 100)
    turtle.circle(-40, 20)
    turtle.circle(40, 70)
    turtle.left(80)
    turtle.circle(60, 40)
    turtle.left(60)
    turtle.circle(-30, 50)
    turtle.circle(20, 80)
    turtle.fd(25)

    # 绘制脸
    turtle.penup()  # 抬起画笔
    turtle.goto(lx, ly)  # 移动到嫦娥脸部的位置
    turtle.seth(-140)  # 设置画笔朝向为-140度
    turtle.fd(16)
    turtle.seth(-100)
    turtle.color("#fffceb")  # 设置画笔颜色为浅黄色
    turtle.pendown()  # 放下画笔
    turtle.circle(-30, 100)# 绘制半径为30的圆弧，角度为100度
    turtle.color('black')
    turtle.begin_fill()
    turtle.circle(-30, 30)
    # 耳朵
    turtle.left(100)
    turtle.circle(-10, 180)
    turtle.circle(-2, 60)
    turtle.circle(-40, 20)
    # 绘制头发和发髻
    # 头发
    turtle.left(150)
    turtle.circle(-10, 90)
    turtle.circle(80, 10)
    turtle.circle(30, 60)
    turtle.right(100)
    turtle.circle(-20, 70)
    turtle.circle(3, 160)
    turtle.circle(25, 90)
    turtle.left(20)
    turtle.fd(20)
    turtle.right(80)
    turtle.circle(20, 150)
    turtle.right(80)
    turtle.circle(8, 180)
    turtle.right(90)
    turtle.fd(10)
    turtle.right(110)
    turtle.circle(10, 100)
    turtle.right(110)
    turtle.fd(12)
    turtle.circle(8, 110)
    turtle.right(50)
    turtle.circle(12, 70)
    turtle.circle(2, 50)
    turtle.circle(180, 25)
    turtle.end_fill()
    # 发髻
    turtle.penup()
    turtle.circle(180, -25)
    turtle.circle(2, -50)
    turtle.circle(12, -70)
    turtle.right(-50)
    turtle.circle(8, -110)
    turtle.fd(-12)
    turtle.right(-110)
    turtle.circle(10, -100)
    turtle.right(-110)
    turtle.fd(-10)
    turtle.right(-90)
    turtle.circle(8, -180)
    turtle.fd(-25)
    turtle.left(20)
    turtle.color('pink')
    turtle.width(1)
    turtle.pendown()
    turtle.begin_fill()
    turtle.fd(8)
    turtle.right(90)
    turtle.circle(-4, 180)
    turtle.end_fill()
    # 脸
    turtle.penup()
    turtle.width(1)
    turtle.goto(lx, ly)
    turtle.seth(-140)
    turtle.fd(16)
    turtle.seth(-100)
    turtle.color("#ffffeb")
    turtle.pendown()
    turtle.begin_fill()
    turtle.circle(-30, 130)
    turtle.left(100)
    turtle.circle(-10, 180)
    turtle.circle(-2, 60)
    turtle.circle(-40, 20)
    turtle.left(150)
    turtle.circle(-10, 90)

    turtle.circle(80, 10)
    turtle.circle(30, 60)
    turtle.right(100)
    turtle.circle(-20, 70)
    turtle.left(3)
    turtle.circle(-200, 9)
    turtle.end_fill()
    # 绘制眼睛
    turtle.penup()  # 抬起画笔
    turtle.width(6)  # 设置画笔粗细为6
    turtle.goto(lx, ly)  # 移动到嫦娥眼睛的位置
    turtle.color('black')  # 设置画笔颜色为黑色
    turtle.seth(170)
    turtle.fd(25)
    turtle.pendown()
    turtle.seth(120)
    turtle.fd(4)
    turtle.penup()
    turtle.left(90)
    turtle.fd(30)
    turtle.left(90)
    turtle.pendown()
    turtle.fd(4)

    # 绘制嘴
    turtle.penup()  # 抬起画笔
    turtle.circle(100, 10)  # 绘制圆弧表示嘴
    turtle.width(4)  # 设置画笔粗细为4
    turtle.left(40)
    turtle.color('red')  # 设置画笔颜色为红色
    turtle.pendown()
    turtle.circle(100, 3)
    turtle.circle(15, 90)
    turtle.circle(100, 3)
# 初始化乌龟模块设置的函数
def initTurtle():
    # 隐藏乌龟形状
    turtle.hideturtle()
    # 设置画布大小为1000x600像素
    turtle.setup(1000, 600)
    # 设置窗口标题为“嫦娥奔月”
    turtle.title('嫦娥奔月')
    # 设置颜色模式为RGB，每个颜色通道的取值范围是0到255
    turtle.colormode(255)
    # 设置背景颜色为深蓝色，具体颜色代码为(8, 46, 84)
    turtle.bgcolor((8, 46, 84))
    # 设置绘制速度为100，速度范围是1（最慢）到10（最快）
    turtle.speed(100)

# 写诗的函数
def writePoetry():
    # 抬起画笔，移动时不绘制轨迹
    turtle.penup()
    # 将画笔移动到坐标(400, -180)
    turtle.goto(400, -150)
    # 设置画笔颜色为浅灰色，具体颜色代码为(250, 240, 230)
    turtle.pencolor((250, 100, 100))
    # 定义诗句，每个元素是一个诗句
    potery = ["\n明\n月\n几\n时\n有\n", "把\n酒\n问\n青\n天\n", "\n不\n知\n天\n上\n宫\n阙\n", "\n今\n夕\n是\n何\n年\n"]
    # 定义每个诗句显示后，画笔移动到的坐标列表
    coordinates = [(300, -180), (200, -180), (100, -180)]
    # 遍历诗句和对应的坐标
    for i, p in enumerate(potery):
        # 写入当前诗句，align="center"表示文字居中显示，font指定字体样式
        turtle.write(p, align="center", font=("STXingkai", 50, "bold"))
        # 如果不是最后一个诗句，等待2秒后移动到下一个诗句的坐标位置
        if (i + 1) != len(potery):
            time.sleep(2)
            turtle.goto(coordinates[i])

# 画嫦娥
def add_moon_palace():
    draw_ChangE()

# 主函数
def main():
    # 调用初始化函数
    initTurtle()
    # 设置绘制速度
    turtle.speed(100)
    # 调用各个绘制函数
    drawMoon()  # 绘制月亮
    drawCloud()  # 绘制云朵
    drawMountain()  # 绘制山
    writePoetry()  # 写诗
    add_moon_palace()  # 画嫦娥
    # 结束绘制，保持窗口打开
    turtle.done()

# 程序入口
if __name__ == '__main__':
    main()